/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy. */
package cz.pecinovsky.english.pojj.adv_demo.byt_lednička.hra;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_txt.IGame;

import cz.pecinovsky.english.pojj.adv_framework.scenario.TypeOfStep;
import cz.pecinovsky.english.pojj.adv_framework.scenario.TypeOfScenario;
import cz.pecinovsky.english.pojj.adv_framework.scenario.ScenarioStep;
import cz.pecinovsky.english.pojj.adv_framework.scenario.AScenarioManager;

import cz.pecinovsky.english.pojj.adv_framework.test_util._Test_101;
import cz.pecinovsky.english.pojj.adv_framework.test_util._Test_115;

import java.util.Calendar;
import java.util.GregorianCalendar;


//import static cz.pecinovsky.česky.pojj.adventura.rámec_scénářů.TypeOfStep.*;
import static cz.pecinovsky.english.pojj.adv_demo.byt_lednička.hra.Texty.*;



/*******************************************************************************
 * Třída {@code SprávceKonstanta} slouží jako správce scénářů,
 * které mají prověřit a/nebo demonstrovat správnou funkci plánované hry.
 * Jednotlive scénáře jsou iterovatelné posloupností kroků specifikovaných
 * instancemi třídy <code>ScenarioStep</code> z rámce, do nějž se hra začleňuje.
 * <p>
 * Tato třída poskytuje definice využívající globálních textových konstant.
 *
 * @author Rudolf PECINOVSKY
 * @version 3.00,  22.11.2006
 */
public class SprávceKonstanta extends AScenarioManager
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Třída, jejíž instance jsou zde spravovány. */
    private final static Class<? extends IGame> TŘÍDA = Hra_BytLednička.class;

    /** Jmeno autora dane tridy. */
    private static final String autor = "PECINOVSKÝ Rudolf";

    /** X-name autora/autorky scénáře. */
    private static final String xname = "XPECR999";

    /** Pomocné konstanty pro rozhovor s ledničkou. */
    private static final int ROKŮ = 20;
    private static final int LETOS;
    private static final int ROK_NAR;
    static {
        Calendar cal = new GregorianCalendar();
        LETOS   = cal.get(Calendar.YEAR);
        ROK_NAR = LETOS - ROKŮ;
    }

    private static final ScenarioStep UVÍTÁNÍ =
        new ScenarioStep( "", //Název prvního příkazu musí být prázdný řetězec
            zCELÉ_UVÍTÁNÍ,

            PŘEDSÍŇ,
            new String[] { LOŽNICE, OBÝVÁK, KOUPELNA },
            new String[] { BOTNÍK, DEŠTNÍK },
            new String[] {},
            TypeOfStep.tsSTART );

//    static { ScenarioStep.setIndex(999); }
//    private static final ScenarioStep UKONČENÍ =
//        new ScenarioStep( pKONEC,
//            zKONEC,
//
//            KUCHYŇ,
//            new String[] { OBÝVÁK, LOŽNICE },
//            new String[] { LEDNIČKA, PAPÍR },
//            new String[] { PIVO },
//            TypeOfStep.tsEND );


    /***************************************************************************
     * Konstruktor plnohodnotné instance třídy {@link ScenarioStep}
     * vyžaduje následující parametry:
     *      String   příkaz;
     *      String   zpráva;
     *      String   prostor;
     *      String[] východy;
     *      String[] předměty;
     *      String[] batoh;
     *      TypeOfStep typTestu;
     */


    /***************************************************************************
     * Základní úspěšný scénář popisující očekávatelný úspěšný průběh hry.
     * Tento scénář není nejkraším možným, takže to vlastně není základní
     * úspěšný scénář, ale ideální nejkratší scénář nevyhovuje některým
     * okrajovým podmínkám zadání (je moc jednoduchý).
     */
    private static final ScenarioStep[] ÚSPĚŠNÝ =
    {
        UVÍTÁNÍ,

        new ScenarioStep( pJDI + " " + KOUPELNA,
            zPŘESUN + KOUPELNA +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(BRÝLE, UMYVADLO, ČASOPIS), cm()),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { BRÝLE, UMYVADLO, ČASOPIS },
            new String[] {},
            TypeOfStep.tsMOVE ),

        new ScenarioStep( pVEZMI + " " + BRÝLE,
            zZVEDNUTO + BRÝLE +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(UMYVADLO, ČASOPIS), cm(BRÝLE)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { UMYVADLO, ČASOPIS },
            new String[] { BRÝLE },
            TypeOfStep.tsPICK_UP ),

        new ScenarioStep( pVEZMI + " " + ČASOPIS,
            zZVEDNUTO + ČASOPIS +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(UMYVADLO), cm(BRÝLE, ČASOPIS)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { UMYVADLO },
            new String[] { BRÝLE, ČASOPIS },
            TypeOfStep.tsPICK_UP ),

        new ScenarioStep( pJDI + " " + PŘEDSÍŇ,
            zPŘESUN   + PŘEDSÍŇ +
            String.format(FORMÁT_INFORMACE,
                PŘEDSÍŇ, cm(LOŽNICE, OBÝVÁK, KOUPELNA),
                cm(BOTNÍK,  DEŠTNÍK), cm(BRÝLE, ČASOPIS)),

            PŘEDSÍŇ,
            new String[] { LOŽNICE, OBÝVÁK, KOUPELNA },
            new String[] { BOTNÍK, DEŠTNÍK },
            new String[] { BRÝLE, ČASOPIS },
            TypeOfStep.tsMOVE ),

        new ScenarioStep( pJDI + " " + OBÝVÁK,
            zPŘESUN   + OBÝVÁK   +
            String.format(FORMÁT_INFORMACE,
                OBÝVÁK, cm(KUCHYŇ, PŘEDSÍŇ),
                cm(TELEVIZE), cm(BRÝLE, ČASOPIS)),

            OBÝVÁK,
            new String[] { KUCHYŇ, PŘEDSÍŇ },
            new String[] { TELEVIZE },
            new String[] { BRÝLE, ČASOPIS },
            TypeOfStep.tsMOVE ),

        new ScenarioStep( pJDI + " " + KUCHYŇ,
            zPŘESUN   + KUCHYŇ +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK,   LOŽNICE),
                cm(LEDNIČKA, PAPÍR), cm(BRÝLE, ČASOPIS)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, PAPÍR },
            new String[] { BRÝLE, ČASOPIS },
            TypeOfStep.tsMOVE ),

        new ScenarioStep( pOTEVŘI + " " + LEDNIČKA,
            LEDNICE_NEJDE_OTEVŘÍT +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK,   LOŽNICE),
                cm(LEDNIČKA, PAPÍR), cm(BRÝLE, ČASOPIS)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, PAPÍR },
            new String[] { BRÝLE, ČASOPIS },
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pVEZMI + " " + PAPÍR,
            zBATOH_PLNÝ +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK,   LOŽNICE),
                cm(LEDNIČKA, PAPÍR), cm(BRÝLE, ČASOPIS)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, PAPÍR },
            new String[] { BRÝLE, ČASOPIS },
            TypeOfStep.tsBAG_FULL ),

        new ScenarioStep( pPOLOŽ + " " + ČASOPIS,
            zPOLOŽENO + ČASOPIS +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(LEDNIČKA, PAPÍR, ČASOPIS), cm(BRÝLE)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, PAPÍR, ČASOPIS },
            new String[] { BRÝLE },
            TypeOfStep.tsPUT_DOWN ),

        new ScenarioStep( pVEZMI + " " + PAPÍR,
            zZVEDNUTO + PAPÍR +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(LEDNIČKA, ČASOPIS), cm(BRÝLE, PAPÍR)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, ČASOPIS },
            new String[] { BRÝLE, PAPÍR },
            TypeOfStep.tsPICK_UP ),

        new ScenarioStep( pPŘEČTI + " " + PAPÍR,
            CHCE_PŘEČÍST_VZKAZ + NEMÁ_BRÝLE +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(LEDNIČKA, ČASOPIS), cm(BRÝLE, PAPÍR)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, ČASOPIS },
            new String[] { BRÝLE, PAPÍR },
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pNASAĎ + " " + BRÝLE,
            NASADIL_BRÝLE +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(LEDNIČKA, ČASOPIS), cm(PAPÍR)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, ČASOPIS },
            new String[] { PAPÍR },
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pPŘEČTI + " " + PAPÍR,
            NAPSÁNO +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(LEDNIČKA, ČASOPIS), cm(PAPÍR)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, ČASOPIS },
            new String[] { PAPÍR },
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pVEZMI + " " + ČASOPIS,
            zZVEDNUTO + ČASOPIS +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(LEDNIČKA), cm(PAPÍR, ČASOPIS)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA },
            new String[] { PAPÍR, ČASOPIS },
            TypeOfStep.tsPICK_UP ),

        new ScenarioStep( pPODLOŽ + " " + LEDNIČKA + " " + ČASOPIS,
            CHCE_PODLOŽIT  + LEDNIČKA + PŘEDMĚTEM + ČASOPIS + "." +
            NELZE_NADZVEDNOUT +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(LEDNIČKA), cm(PAPÍR, ČASOPIS)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA },
            new String[] { PAPÍR, ČASOPIS  },
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pPOLOŽ + " " + PAPÍR,
            zPOLOŽENO + PAPÍR +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(PAPÍR, LEDNIČKA), cm(ČASOPIS)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { PAPÍR, LEDNIČKA },
            new String[] { ČASOPIS },
            TypeOfStep.tsPUT_DOWN ),

        new ScenarioStep( pPODLOŽ + " " + LEDNIČKA + " " + ČASOPIS,
            CHCE_PODLOŽIT  + LEDNIČKA + PŘEDMĚTEM + ČASOPIS + "." +
            LEDNIČKA_PODLOŽENA +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(PAPÍR, LEDNIČKA), cm()),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { PAPÍR, LEDNIČKA },
            new String[] {},
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pOTEVŘI + " " + LEDNIČKA,
            OTEVŘEL_LEDNIČKU +
            String.format(FORMÁT_INFORMACE,
                LEDNIČKA, cm(),
                cm(PIVO, PIVO, PIVO, SALÁM, HOUSKA, VÍNO, RUM), cm()),

            LEDNIČKA,
            new String[] {},
            new String[] { PIVO, PIVO, PIVO, SALÁM, HOUSKA, VÍNO, RUM },
            new String[] {},
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pVEZMI + " " + PIVO,
            BERE_ALKOHOL + PIVO + "." +
            KOLIK_LET,

            LEDNIČKA,
            new String[] {},
            new String[] { PIVO, PIVO, PIVO, SALÁM, HOUSKA, VÍNO, RUM },
            new String[] {},
            TypeOfStep.tsUNMOVABLE ),

        new ScenarioStep( ""+ROKŮ,
            NAROZEN,

            LEDNIČKA,
            new String[] {},
            new String[] { PIVO, PIVO, PIVO,
                           SALÁM, HOUSKA, VÍNO, RUM },
            new String[] {},
            TypeOfStep.tsDIALOG ),

        new ScenarioStep( "" + ROK_NAR,
            ODEBRAL + PIVO,

            LEDNIČKA,
            new String[] {},
            new String[] { PIVO, PIVO, SALÁM, HOUSKA, VÍNO, RUM },
            new String[] { PIVO },
            TypeOfStep.tsDIALOG ),

        new ScenarioStep( pZAVŘI + " " + LEDNIČKA,
            ZAVŘEL_LEDNIČKU +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(PAPÍR, LEDNIČKA), cm(PIVO)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, PAPÍR },
            new String[] { PIVO },
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pKONEC,
            zKONEC,

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, PAPÍR },
            new String[] { PIVO },
            TypeOfStep.tsEND ),

//        UKONČENÍ
    };

    static { ScenarioStep.setIndex(2); }

    /***************************************************************************
     * Základní chybový scénář definující reakce
     * na povinnou sadu chybových stavů.
     */
    private static final ScenarioStep[] CHYBOVÝ =
    {
        UVÍTÁNÍ,

        new ScenarioStep( "maso",
            zNEZNÁMÝ_PŘÍKAZ +
            String.format(FORMÁT_INFORMACE,
                PŘEDSÍŇ, cm(LOŽNICE, OBÝVÁK, KOUPELNA),
                cm(BOTNÍK,  DEŠTNÍK), cm()),

            PŘEDSÍŇ,
            new String[] { LOŽNICE, OBÝVÁK, KOUPELNA },
            new String[] { BOTNÍK,  DEŠTNÍK },
            new String[] {},
            TypeOfStep.tsUNKNOWN ),

        new ScenarioStep( "",
            zPRÁZDNÝ_PŘÍKAZ +
            String.format(FORMÁT_INFORMACE,
                PŘEDSÍŇ, cm(LOŽNICE, OBÝVÁK, KOUPELNA),
                cm(BOTNÍK,  DEŠTNÍK), cm()),

            PŘEDSÍŇ,
            new String[] { LOŽNICE, OBÝVÁK, KOUPELNA },
            new String[] { BOTNÍK,  DEŠTNÍK },
            new String[] {},
            TypeOfStep.tsEMPTY ),

        new ScenarioStep( pVEZMI + " " + DEŠTNÍK,
            zZVEDNUTO + DEŠTNÍK +
            String.format(FORMÁT_INFORMACE,
                PŘEDSÍŇ, cm(LOŽNICE, OBÝVÁK, KOUPELNA),
                cm(BOTNÍK), cm(DEŠTNÍK)),

            PŘEDSÍŇ,
            new String[] { LOŽNICE, OBÝVÁK, KOUPELNA },
            new String[] { BOTNÍK },
            new String[] { DEŠTNÍK },
            TypeOfStep.tsPICK_UP ),

        new ScenarioStep( pJDI + " " + KOUPELNA,
            zPŘESUN + KOUPELNA +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(BRÝLE, UMYVADLO, ČASOPIS), cm(DEŠTNÍK)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { BRÝLE, UMYVADLO, ČASOPIS },
            new String[] { DEŠTNÍK },
            TypeOfStep.tsMOVE ),

        new ScenarioStep( pJDI + " záchod",
            zNENÍ_CIL +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(BRÝLE, UMYVADLO, ČASOPIS), cm(DEŠTNÍK)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { BRÝLE, UMYVADLO, ČASOPIS },
            new String[] { DEŠTNÍK },
            TypeOfStep.tsBAD_NEIGHBOR ),

        new ScenarioStep( pVEZMI + " " + KOUPELNA,
            zNENÍ_PŘEDMĚT + KOUPELNA +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(BRÝLE, UMYVADLO, ČASOPIS), cm(DEŠTNÍK)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { BRÝLE, UMYVADLO, ČASOPIS },
            new String[] { DEŠTNÍK },
            TypeOfStep.tsBAD_OBJECT ),

        new ScenarioStep( pVEZMI + " " + UMYVADLO,
            zTĚŽKÝ_PŘEDMĚT + UMYVADLO +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(BRÝLE, UMYVADLO, ČASOPIS), cm(DEŠTNÍK)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { BRÝLE, UMYVADLO, ČASOPIS },
            new String[] { DEŠTNÍK },
            TypeOfStep.tsUNMOVABLE ),

        new ScenarioStep( pPOLOŽ + " " + PAPÍR,
            zNENÍ_V_BATOHU + PAPÍR +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(BRÝLE, UMYVADLO, ČASOPIS), cm(DEŠTNÍK)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { BRÝLE, UMYVADLO, ČASOPIS },
            new String[] { DEŠTNÍK },
            TypeOfStep.tsNOT_IN_BAG ),

        new ScenarioStep( pVEZMI + " " + BRÝLE,
            zZVEDNUTO + BRÝLE +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(UMYVADLO, ČASOPIS), cm(BRÝLE, DEŠTNÍK)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { UMYVADLO, ČASOPIS },
            new String[] { BRÝLE, DEŠTNÍK },
            TypeOfStep.tsPICK_UP ),

        new ScenarioStep( pVEZMI + " " + ČASOPIS,
            zBATOH_PLNÝ +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(UMYVADLO, ČASOPIS), cm(BRÝLE, DEŠTNÍK)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { UMYVADLO, ČASOPIS },
            new String[] { BRÝLE, DEŠTNÍK },
            TypeOfStep.tsBAG_FULL ),

        new ScenarioStep( pHELP,
            zNÁPOVĚDA,
            //Text pokračuje vyjmenováním příkazů a jejich popisů
            //a končí standardním popisem aktuální situace

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { UMYVADLO, ČASOPIS },
            new String[] { BRÝLE, DEŠTNÍK },
            TypeOfStep.tsHELP ),

        new ScenarioStep( pKONEC,
            zKONEC,

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { UMYVADLO, ČASOPIS },
            new String[] { BRÝLE, DEŠTNÍK },
            TypeOfStep.tsEND ),
    };


    static { ScenarioStep.setIndex(2); }

    /***************************************************************************
     * Nejkraší možný scénář vedoucí k úspěšnému dokončení hry.
     * Teoreticky by měl být základním úspěšným,
     * ale nevyhovuje nětkerým požadavkům zadání,
     * tak je zařazen jako dodatečný kontrolovatelný scénář.
     */
    private static final ScenarioStep[] NEJKRATŠÍ =
    {
        UVÍTÁNÍ,

        new ScenarioStep( pJDI + " " + KOUPELNA,
            zPŘESUN + KOUPELNA +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(BRÝLE, UMYVADLO, ČASOPIS), cm()),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { BRÝLE, UMYVADLO, ČASOPIS },
            new String[] {},
            TypeOfStep.tsMOVE ),

        new ScenarioStep( pVEZMI + " " + ČASOPIS,
            zZVEDNUTO + ČASOPIS +
            String.format(FORMÁT_INFORMACE,
                KOUPELNA, cm(PŘEDSÍŇ),
                cm(BRÝLE, UMYVADLO), cm(ČASOPIS)),

            KOUPELNA,
            new String[] { PŘEDSÍŇ },
            new String[] { BRÝLE, UMYVADLO },
            new String[] { ČASOPIS },
            TypeOfStep.tsPICK_UP ),

        new ScenarioStep( pJDI + " " + PŘEDSÍŇ,
            zPŘESUN   + PŘEDSÍŇ +
            String.format(FORMÁT_INFORMACE,
                PŘEDSÍŇ, cm(LOŽNICE, OBÝVÁK, KOUPELNA),
                cm(BOTNÍK,  DEŠTNÍK), cm(ČASOPIS)),

            PŘEDSÍŇ,
            new String[] { LOŽNICE, OBÝVÁK, KOUPELNA },
            new String[] { BOTNÍK, DEŠTNÍK },
            new String[] { ČASOPIS },
            TypeOfStep.tsMOVE ),

        new ScenarioStep( pJDI + " " + OBÝVÁK,
            zPŘESUN   + OBÝVÁK   +
            String.format(FORMÁT_INFORMACE,
                OBÝVÁK, cm(KUCHYŇ, PŘEDSÍŇ),
                cm(TELEVIZE), cm(ČASOPIS)),

            OBÝVÁK,
            new String[] { KUCHYŇ, PŘEDSÍŇ },
            new String[] { TELEVIZE },
            new String[] { ČASOPIS },
            TypeOfStep.tsMOVE ),

        new ScenarioStep( pJDI + " " + KUCHYŇ,
            zPŘESUN   + KUCHYŇ +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK,   LOŽNICE),
                cm(LEDNIČKA, PAPÍR), cm(ČASOPIS)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, PAPÍR },
            new String[] { ČASOPIS },
            TypeOfStep.tsMOVE ),

        new ScenarioStep( pPODLOŽ + " " + LEDNIČKA + " " + ČASOPIS,
            CHCE_PODLOŽIT  + LEDNIČKA + PŘEDMĚTEM + ČASOPIS + "." +
            LEDNIČKA_PODLOŽENA +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(PAPÍR, LEDNIČKA), cm()),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { PAPÍR, LEDNIČKA },
            new String[] {},
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pOTEVŘI + " " + LEDNIČKA,
            OTEVŘEL_LEDNIČKU +
            String.format(FORMÁT_INFORMACE,
                LEDNIČKA, cm(),
                cm(PIVO, PIVO, PIVO, SALÁM, HOUSKA, VÍNO, RUM), cm()),

            LEDNIČKA,
            new String[] {},
            new String[] { PIVO, PIVO, PIVO, SALÁM, HOUSKA, VÍNO, RUM },
            new String[] {},
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pVEZMI + " " + PIVO,
            BERE_ALKOHOL + PIVO + "." +
            KOLIK_LET,

            LEDNIČKA,
            new String[] {},
            new String[] { PIVO, PIVO, PIVO, SALÁM, HOUSKA, VÍNO, RUM },
            new String[] {},
            TypeOfStep.tsUNMOVABLE ),

        new ScenarioStep( ""+ROKŮ,
            NAROZEN,

            LEDNIČKA,
            new String[] {},
            new String[] { PIVO, PIVO, PIVO,
                           SALÁM, HOUSKA, VÍNO, RUM },
            new String[] {},
            TypeOfStep.tsDIALOG ),

        new ScenarioStep( "" + ROK_NAR,
            ODEBRAL + PIVO,

            LEDNIČKA,
            new String[] {},
            new String[] { PIVO, PIVO, SALÁM, HOUSKA, VÍNO, RUM },
            new String[] { PIVO },
            TypeOfStep.tsDIALOG ),

        new ScenarioStep( pZAVŘI + " " + LEDNIČKA,
            ZAVŘEL_LEDNIČKU +
            String.format(FORMÁT_INFORMACE,
                KUCHYŇ, cm(OBÝVÁK, LOŽNICE),
                cm(PAPÍR, LEDNIČKA), cm(PIVO)),

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, PAPÍR },
            new String[] { PIVO },
            TypeOfStep.tsNON_STANDARD ),

        new ScenarioStep( pKONEC,
            zKONEC,

            KUCHYŇ,
            new String[] { OBÝVÁK, LOŽNICE },
            new String[] { LEDNIČKA, PAPÍR },
            new String[] { PIVO },
            TypeOfStep.tsEND ),

//        UKONČENÍ
    };


    /***************************************************************************
     * Příkazy pro demonstrační scénář sloužící k analýze funkce
     * grafického uživatelského rozhraní.
     * Scénář má za úkol projít jeméně třemi místnostmi,
     * zvednout nejméně dva objekty a položit je v jiné místnosti,
     * než ve které je zvedal.
     * Příkazy pro demonstrační scénář neobsahuje úvodní prázdný příkaz,
     * ten si konstruktor scénáře doplní sám.
     */
    String[] demonstrační = {
             pJDI   + " " + KOUPELNA,
             pVEZMI + " " + BRÝLE,
             pVEZMI + " " + ČASOPIS,
             pJDI   + " " + PŘEDSÍŇ,
             pJDI   + " " + OBÝVÁK,
             pPOLOŽ + " " + ČASOPIS,
             pPOLOŽ + " " + BRÝLE,
             pKONEC
    };


    /** Jediná instance této třídy. Spravuje všechny scénáře sdružené hry. */
    private static final SprávceKonstanta SS = new SprávceKonstanta();



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vrátí správce scénářů - jedinou instanci této třídy.
     *
     * @return Správce scénářů
     */
    public static SprávceKonstanta getInstance()
    {
        return SS;
    }


    /***************************************************************************
     * Vytvoří instanci představující správce scénářů hry.
     */
    public SprávceKonstanta()
    {
        super(autor, xname, TŘÍDA);

        addScenario("Úspěšný",      TypeOfScenario.scHAPPY,    ÚSPĚŠNÝ);
        addScenario("Chybový",      TypeOfScenario.scMISTAKES, CHYBOVÝ);
        addScenario("Demo for GUI",  demonstrační);
        addScenario("Nejkratší",    TypeOfScenario.scGENERAL,  NEJKRATŠÍ);
        seal();
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================

    /***************************************************************************
     * Základní test ověřující, jestli správce scénářů vyhovuje
     * zadným okrajovým podmínkám.
     */
    public static void testSprávceScénářů()
    {
        _Test_101 test = _Test_101.getInstance(SS);
        test.testScenarioManager();
    }


    /***************************************************************************
     * Testování funkce hry prováděné postupně
     * prostřednictvím všech scénářů daného správce
     */
    public static void prověrkaHry()
    {
        IGame     hra  = SS.getGame();
        _Test_101 test = _Test_101.getInstance(hra);
        test.testGame();
    }


    /***************************************************************************
     * Test ověřujícífunkci textové verze hry.
     */
    public static void testTXT()
    {
        IGame     hra  = SS.getGame();
        _Test_101 test = _Test_101.getInstance(hra);
        test.playGameByScenario(INDEX_GUI_TEST);
    }


    /***************************************************************************
     * Test demonstrující hraní hry na daném GUI.
     */
    public static void testGUI()
    {
        IGameG    hra  = (IGameG)SS.getGame();
        _Test_115 test = _Test_115.getInstance(hra);
        test.playGameByScenario(INDEX_GUI_TEST);
    }


    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )
    {
        testTXT();
    }
}
